package org.lc.cmd;

import org.jline.reader.Candidate;
import org.jline.reader.ParsedLine;
import org.lc.cmd.impl.SolonCommand;

import java.util.List;
import java.util.Map;
import java.util.function.Supplier;

/**
 * 参数数据自动补全
 * 实现可以是bean
 */
@FunctionalInterface
public interface DataCompleter {
    /**
     * 自动补全
     * 注意候选项的value必须以[prefix][currentData]开头
     * <p>
     * 例如：当前参数已输入"--ip=127.0."，此时prefix是"--ip="，currentData是"127.0."，如果此时可补全值为127.0.0.1，可添加以下待选项
     * new Candidate("--ip=127.0.0.1", "127.0.0.1", null, "设备ip", null, null)
     * 往candidates里面加入的值只有以已输入的内容开头才有效。
     * </p>
     *
     * @param cmd 命令（对应类）
     * @param subCmd 子命令（对应方法）
     * @param param 参数（对应参数/字段/属性）
     * @param currentData 当前已输入的数据（例如ip已经输入了一部分）
     * @param candidates 补全列表，可将候选项加入list，或者排除一些错误候选项
     * @param prefix 参数已存在的前缀
     * @param line 输入行信息
     * @param parseFunc 参数解析方法
     */
    void complete(SolonCommand cmd, SolonCommand.SolonMethodCommand subCmd, CmdParam param, String currentData,
            List<Candidate> candidates, String prefix, ParsedLine line, Supplier<Map<String, Object>> parseFunc);
}
